package com.dlc.shop.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dlc.shop.bean.app.dto.SkuDto;
import com.dlc.shop.bean.app.vo.SkuVO;
import com.dlc.shop.bean.dto.StockPointSkuDTO;
import com.dlc.shop.bean.model.Product;
import com.dlc.shop.bean.model.Sku;
import com.dlc.shop.bean.model.StockBillLog;
import com.dlc.shop.bean.model.StockBillLogItem;
import com.dlc.shop.bean.param.ProductParam;
import com.dlc.shop.bean.vo.SkuComboVO;
import com.dlc.shop.bean.vo.SkuStockVO;
import com.dlc.shop.common.util.PageParam;
import jakarta.servlet.http.HttpServletResponse;

import java.util.List;
import java.util.Map;

/**
 *
 * @author lgh on 2018/09/29.
 */
public interface SkuService extends IService<Sku> {

    /**
     * 根据商品id获取商品中的sku列表（将会被缓存起来）(如果不需要sku库存、skuName信息，就使用该接口)
     * 从缓存中获取的skuName并不是当前语言的，如果需要skuName，建议用 listByProdId
     * 注意：该接口只有sku和sku国际化信息，不包含sku库存信息
     *
     * @param prodId 商品id
     * @return sku列表
     */
    List<Sku> listSkuByProdId(Long prodId);

    /**
     * 根据商品id获取商品中的sku列表
     * 从缓存中获取的sku数据，并对skuName进行了处理,是当前语言的
     * 注意：该接口只有sku和sku国际化信息，不包含sku库存信息
     * @param prodId 商品id
     * @return sku列表
     */
    List<Sku> listSkuAndSkuNameByProdId(Long prodId);

    /**
     * 获取sku、sku国际化、sku库存信息列表
     *
     * @param prodId 商品id
     * @param mold
     * @return sku列表
     */
    List<Sku> listSkuAndSkuStock(Long prodId, Integer mold);


    /**
     * 获取sku信息、库存及语言列表
     *
     * @param prodId
     * @param mold
     * @return
     */
    List<Sku> listSkuAndSkuStockAndLang(Long prodId, Integer mold);

    /**
     * 获取启用的sku、sku国际化、sku库存信息列表 （只获取启动状态的sku，不包含禁用的sku）
     * 在listSkuAndSkuStock() 的基础上过滤掉禁用的sku
     *
     * @param prodId 商品id
     * @param mold
     * @return sku列表
     */
    List<Sku> listPutOnSkuAndSkuStock(Long prodId, Integer mold);

    /**
     * 根据skuId获取sku及库存信息（将会被缓存起来, 不需要skuName时使用）
     * skuName并不是当前语言的，如果需要当前语言的skuName，建议使用getSkuAndName
     *
     * @param skuId shuId
     * @return
     */
    Sku getSkuBySkuId(Long skuId);

    /**
     * 根据skuId获取sku及库存信息-sku信息和sku名称
     * @param skuId shuId
     * @return
     */
    Sku getSkuAndName(Long skuId);

    /**
     * 根据id获取sku语言列表
     * @param skuId
     * @return
     */
    Sku getSkuListBySkuId( Long skuId);

    /**
     * 删除sku的缓存（包含sku、sku列表、sku库存的缓存）
     *
     * @param skuId skuId
     * @param prodId 商品id
     */
    void removeSkuCacheBySkuId(Long skuId, Long prodId);

    /**
     * 删除sku库存的缓存（包含sku、sku库存的缓存）
     * @param prodId 商品id
     * @param skuId skuId
     */
    void removeSkuStockCache(Long skuId, Long prodId);

    /**
     * 删除sku库存的缓存（包含sku、sku库存的缓存）
     * @param skuMap 商品id
     */
    void batchRemoveSkuStockCache(Map<Long, Long > skuMap);

    /**
     * 更新sku
     *
     * @param sku  sku
     * @param mold
     */
    void updateSku(Sku sku, Integer mold);

    /**
     * 批量保存sku、sku语言和sku库存表
     *
     * @param skuList sku列表
     * @param mold
     * @param shopId
     * @param spuStatus
     * @param mobile
     * @param employeeId
     * @return
     */
    List<SkuStockVO> insertBatchAndLang(List<Sku> skuList, Long shopId, Integer mold, Integer spuStatus, String mobile, Long employeeId);

    /**
     * 分页获取sku
     * @param page
     * @param product
     * @return
     */
    IPage<Sku> pageSku(PageParam<Sku> page, ProductParam product);

    /**
     * 根据商品id列表获取有商品编号的
     * @param prodIds 获取商品编号的商品id列表
     * @param disProdId  过滤掉的商品
     * @return
     */
    List<String> listSkuByProdIds(List<Long> prodIds,Long disProdId);

    /**
     * 根据商品id列表获取有商品编号的
     * @param prodIds 获取商品编号的商品id列表
     * @return
     */
    List<Sku> listSkuAndLangByProdIds(List<Long> prodIds);

    /**
     * 根据编码获取sku信息(sku、商品名称、sku库存信息)
     * @param shopId
     * @param partyCode
     * @return
     */
    Sku getSkuByShopIdAndPartyCode(Long shopId, String partyCode);

    /**
     * 查询库存
     * @param page
     * @param productParam
     * @return
     */
    IPage<StockBillLogItem> inquireStock(PageParam<StockBillLog> page, ProductParam productParam);

    /**
     * 导出sku信息
     * @param product
     * @param response
     */
    void exportSkuList(ProductParam product, HttpServletResponse response);
    /**
     * 获取指定商品的sku列表（包括sku库存信息等）（仅获取启用状态）
     * @param product
     * @return
     */
    List<SkuDto> getProdDetailSkuInfo(Product product);

    /**
     * 或者指定的sku列表
     * @param skuIds
     * @return
     */
    List<Sku> listSkuBySkuIds(List<Long> skuIds);

    /**
     * 获取库存预警数量
     * @param shopId 店铺id
     * @return
     */
    Long stockWarningCount(Long shopId);

    /**
     * 组合商品获取所有组合的商品信息并组装,然后计算出对应库存
     * @param skus
     */
    void assembleComboSpuListAndStock(List<Sku> skus);


    /**
     * 获取sku及其多语言集合
     * @param skuDto skuDTO
     * @return skuVO集合
     */
    List<SkuVO> listSkuWithLang(SkuDto skuDto);

    /**
     * 通过库存点id获取sku信息和sku库存信息列表
     *
     * @param stockPointId 库存点id
     * @param inStockPointId 入库库存点id
     * @param queryHasStock 是否只查询有库存的数据
     * @return
     */
    List<SkuVO> listSkuAndStockByStockPointId(Long stockPointId,
                                              Long inStockPointId,
                                              Integer queryHasStock);

    /**
     * 添加库存关联数据
     * @param spuMold
     * @param stockPointS
     * @param prodId
     * @param spuStatus
     * @param skuStocks
     * @param skuDTO
     * @param defaultWarehouseId
     */
    void addStockPoint(Integer spuMold, List<StockPointSkuDTO> stockPointS, Long prodId, Integer spuStatus, List<SkuStockVO> skuStocks, Sku skuDTO, Long defaultWarehouseId);


    /**
     * 批量更新sku库存预警状态
     * @param skuList
     */
    void batchUpdateSkuWarning(List<Sku> skuList);

    /**
     * 当前关联商品列表是否有共同供货仓库,以及共同库存数量
     *
     * @param comboSkuIds
     * @return
     */
    SkuVO calculateStockBySkuIds(List<SkuComboVO> comboSkuIds);


    /**
     * 插入sku库存
     * @param skus
     * @return
     */
    void setSkuStock(List<Sku> skus);

    /**
     * 根据sku获取商品库存
     * @param prodIds
     * @return
     */
    Map<Long, SkuStockVO> mapProdStock(List<Long> prodIds);

    /**
     * 分页获取sku 信息
     * @param page 分页
     * @param goodsSourceStatus 空
     * @return
     */
    public IPage<Sku> pageGoodsSourceStatusSku(PageParam<Sku> page, Integer goodsSourceStatus);

    /**
     * 更新商品 sku 信息
     * @param goodsSourceStatus 商品同步状态
     * @param skuId  商品skuid
     */
    public void updateGoodSourceStatus(Integer goodsSourceStatus, Long skuId);
}
